package model

import (
	"errors"
	"fmt"

	"gorm.io/gorm"
)

// User 用户表
type User struct {
	// 用户Id
	Uid string `gorm:"size:20;primary_key" json:"uid"`
	// 姓名
	Name string `gorm:"size:100" json:"name"`
	// 角色
	Role string `gorm:"size:10" json:"role"`
	// 盐
	Salt string `gorm:"size:32" json:"-"`
	// 密码
	Password string `gorm:"size:60" json:"-"`
	// 状态 true - 有效 false - 无效
	Status bool `json:"status"`
}

// -------------------------- User ------------------------

// 用户注册
func CreateUser(user *User) error {
	row := db.Create(user)
	if row.Error != nil {
		return row.Error
	}
	if row.RowsAffected != 1 {
		return errors.New("用户注册失败")
	}
	return nil
}

// 创建管理用户
func CreateAdmin(salt string, password string) error {
	user := &User{
		Uid:      "admin",
		Salt:     salt,
		Password: password,
		Name:     "管理员",
		Role:     "admin",
		Status:   true,
	}
	return CreateUser(user)
}

// 密码修改
func Reset(uid string, password string, salt string) error {
	row := db.Model(&User{}).Where("uid = ?", uid).Updates(map[string]interface{}{"uid": uid, "password": password, "salt": salt})
	if row.Error != nil {
		return row.Error
	}
	if row.RowsAffected < 1 {
		return errors.New("用户密码修改失败")
	}
	return nil
}

// 用户状态修改
func SetUserStatus(uid string, status bool) error {
	// 设置用户状态
	if err := db.Model(&User{}).Where("uid = ?", uid).Update("status", status).Error; err != nil {
		return err
	}
	return nil
}

// 检查用户是否存在
func IsUserExists(uid string) bool {
	user := new(User)
	if err := db.Where("uid = ?", uid).Take(user).Error; err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return false
		}
	}
	return true
}

// 检查用户的是否可以执行
func IsOnlyAdminkUser() bool {
	var count int64
	db.Model(&User{}).Where("role = ? and status = ?", "admin", true).Count(&count)
	return count < 2
}

// 用户删除
func RemoveUser(uid string) error {
	// 删除用户
	if err := db.Where("uid = ?", uid).Delete(&User{}).Error; err != nil {
		return err
	}
	return nil
}

// 获取用户清单
func GetUsers() *[]User {
	users := new([]User)
	db.Find(users)
	return users
}

// 获取用户信息
func GetUser(userId string) (*User, error) {
	user := new(User)
	row := db.Where("uid=?", userId).Take(user)
	if row.Error != nil {
		if errors.Is(row.Error, gorm.ErrRecordNotFound) {
			return nil, fmt.Errorf("用户%s未注册", userId)
		}
		return nil, row.Error
	}
	return user, nil
}
